// 当前运行的代码部分
#include <iostream>
#include <string>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>

using namespace std;

// 将pthread_t类型的线程ID转换为十六进制字符串
std::string toHex(pthread_t tid)
{
    char hex[64];
    // 将线程ID格式化为十六进制字符串，%p是指针格式符
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

// 线程执行函数
void *threadRoutine(void *args)
{
    while(true)
    {
        // pthread_self()获取当前线程的ID
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);  // 休眠1秒
    }
}

int main()
{
    pthread_t tid;  // 定义线程ID变量
    // 创建新线程，传入线程ID地址、默认属性、线程函数、线程参数
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

    cout << "main thread create thead done, new thread id : " << toHex(tid) << endl;
    pthread_join(tid, nullptr);  // 等待新线程结束

    return 0;
}

// 注释掉的第一部分代码：使用C++11线程库
/*
// C++11提供的线程支持
void threadrun()
{
    while(true)
    {
        cout << "I am a new thead for C++" << endl;
        sleep(1);
    }
}

int main()
{
    // 创建C++11线程对象
    thread t1(threadrun);
    // 等待线程结束
    t1.join();
    return 0;
}
*/

// 注释掉的第二部分代码：线程间的参数传递
/*
// 请求类，用于传递给线程的参数
class Request
{
public:
    Request(int start, int end, const string &threadname)
    : start_(start), end_(end), threadname_(threadname)
    {}
public:
    int start_;      // 计算起始值
    int end_;        // 计算结束值
    string threadname_; // 线程名称
};

// 响应类，用于线程返回结果
class Response
{
public:
    Response(int result, int exitcode):result_(result),exitcode_(exitcode)
    {}
public:
    int result_;    // 计算结果
    int exitcode_;  // 退出码
};

// 线程函数：计算start到end的和
void *sumCount(void *args)
{
    // 将void*转换为Request指针
    Request *rq = static_cast<Request*>(args);
    Response *rsp = new Response(0,0);
    
    // 计算总和
    for(int i = rq->start_; i <= rq->end_; i++)
    {
        cout << rq->threadname_ << " is runing, caling..., " << i << endl;
        rsp->result_ += i;
        usleep(100000);  // 休眠0.1秒
    }
    delete rq;
    return rsp;
}

int main()
{
    pthread_t tid;
    // 创建请求对象
    Request *rq = new Request(1, 100, "thread 1");
    pthread_create(&tid, nullptr, sumCount, rq);

    void *ret;
    pthread_join(tid, &ret);  // 等待线程结束并获取返回值
    Response *rsp = static_cast<Response *>(ret);
    cout << "rsp->result: " << rsp->result_ << ", exitcode: " << rsp->exitcode_ << endl;
    delete rsp;
    return 0;
}
*/

// 注释掉的第三部分代码：线程控制示例
/*
int g_val = 100;  // 全局变量

// 可重入函数示例
void show(const string &name)
{
    cout << name << "say# " << "hello thread" << endl;
}

// 线程函数
void *threadRoutine(void *args)
{
    const char *name = (const char*)args;
    int cnt = 5;
    while (true)
    {
        // 打印线程信息，包括进程ID和全局变量
        printf("%s,  pid: %d, g_val: %d, &g_val: 0x%p\n", 
               name, getpid(), g_val, &g_val);
        sleep(1);
        cnt--;
        if(cnt == 0) break;
    }
    // 线程退出方式：
    // pthread_exit((void*)100);  // 正常退出
    // exit(11);                  // 退出整个进程
    // return (void*)100;         // 返回退出
}

int main()
{
    pthread_t tid;
    // 创建线程
    pthread_create(&tid, nullptr, threadRoutine, (void*)"Thread 1");

    sleep(1);  // 确保新线程已启动
    pthread_cancel(tid);  // 取消线程

    void *retval;
    // 等待线程结束，获取返回值
    pthread_join(tid, &retval);

    cout << "main thread quit ..., ret: " << (long long int)retval << endl;
    return 0;
}
*/